package org.xenon.vote.service;

import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.xenon.vote.dao.imp.BallotDao;
import org.xenon.vote.dao.imp.ChoiceDao;
import org.xenon.vote.dao.imp.TurnDao;
import org.xenon.vote.model.pojo.po.Ballot;
import org.xenon.vote.model.pojo.po.Choice;
import org.xenon.vote.model.pojo.po.Turn;

import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;

@Validated
@Service
public class BallotService {
    private final BallotDao ballotDao;
    private final TurnDao turnDao;
    private final ChoiceDao choiceDao;

    public BallotService(BallotDao ballotDao, TurnDao turnDao, ChoiceDao choiceDao) {
        this.ballotDao = ballotDao;
        this.turnDao = turnDao;
        this.choiceDao = choiceDao;
    }

    /**
     * 获得用户现在拥有的投票数量
     */
    public int getTotalBallot(String mail){
        return ballotDao.getAll(mail).size();
    }

    /**
     * 获得投票的名字
     */
    public String getName(int id){
        return ballotDao.get(id).getName();
    }

    /**
     * 验证请求操作的投票是否属于本人
     * @param id 投票ID
     * @param mail 请求者
     * @return 是否通过
     */
    public boolean checkByBallot(int id, String mail){
        if (mail == null) return false;
        Ballot ballot = ballotDao.get(id);
        if (ballot == null) return false;
        return ballot.getOwner().equals(mail);
    }

    /**
     * 重启一个投票
     * @param ballot 投票ID
     */
    public void restart(int ballot) {
        List<Turn> list = turnDao.getAll(ballot);
        for (Turn t : list) {
            if (t.getOrder()==0) {
                List<Choice> all = choiceDao.getAll(t.getId());
                for (Choice c: all) {
                    c.setScore(0);
                    choiceDao.edit(c);
                }
                continue;
            }
            turnDao.del(t);
        }
    }

    /**
     * 修改投票名字
     *
     * @param id      投票ID
     * @param newName 新名字
     */
    public void editName(int id, String newName) {
        Ballot ballot = ballotDao.get(id);
        ballot.setName(newName);
        ballotDao.edit(ballot);
    }

    /**
     * 修改投票的描述
     *
     * @param id             投票的ID
     * @param newDescription 新的描述
     */
    public void editDescription(int id, String newDescription) {
        Ballot ballot = ballotDao.get(id);
        ballot.setDescription(newDescription);
        ballotDao.edit(ballot);
    }

    public List<Ballot> getAll(String mail) {
        return ballotDao.getAll(mail);
    }

    /**
     * 搜索人员的一些投票, 模糊搜素
     *
     * @param mail    邮件账号
     * @param keyword 关键词
     * @return 查询得到的结果
     */
    public List<Ballot> getAll(String mail, String keyword) {
        char[] keys = keyword.toCharArray();
        StringBuilder sb = new StringBuilder("%");
        for (char c : keys)
            sb.append(c).append('%');
        return ballotDao.getAll(mail, sb.toString());
    }

    /**
     * 创建投票
     *
     * @param owner 所有者的mail
     * @return 创建的投票ID
     */
    public int add(String name, @Email String owner, String description) {
        Date date = new Date();
        ballotDao.add(new Ballot(-1, name, description, date, date, owner));
        Ballot ballot = ballotDao.getAll(owner).get(0);
        return ballot.getId();
    }

    /**
     * 删除投票, 验证了是否属于用户
     *
     * @param id   投票的ID
     * @param user 所有者的邮箱
     */
    public void del(int id, String user) {
        Ballot ballot = ballotDao.get(id);
        if (ballot == null) return;
        if (ballot.getOwner().equals(user))
            ballotDao.del(id);
    }

    /**
     * 删除投票
     *
     * @param id 投票的ID
     */
    public void del(int id) {
        ballotDao.del(id);
    }
}
